package com.hc.programming.number;

/**
 * 七个不同的符号代表罗马数字，其值如下：
 * <p>
 * 符号	值
 * I	1
 * V	5
 * X	10
 * L	50
 * C	100
 * D	500
 * M	1000
 * 罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则：
 * <p>
 * 如果该值不是以 4 或 9 开头，请选择可以从输入中减去的最大值的符号，将该符号附加到结果，减去其值，然后将其余部分转换为罗马数字。
 * 如果该值以 4 或 9 开头，使用 减法形式，表示从以下符号中减去一个符号，例如 4 是 5 (V) 减 1 (I): IV ，9 是 10 (X) 减 1 (I)：IX。仅使用以下减法形式：4 (IV)，9 (IX)，40 (XL)，90 (XC)，400 (CD) 和 900 (CM)。
 * 只有 10 的次方（I, X, C, M）最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5 (V)，50 (L) 或 500 (D)。如果需要将符号附加4次，请使用 减法形式。
 * 给定一个整数，将其转换为罗马数字。
 * <p>
 * 示例 1：
 * 输入：num = 3749
 * 输出： "MMMDCCXLIX"
 * 解释：
 * 3000 = MMM 由于 1000 (M) + 1000 (M) + 1000 (M)
 * 700 = DCC 由于 500 (D) + 100 (C) + 100 (C)
 * 40 = XL 由于 50 (L) 减 10 (X)
 * 9 = IX 由于 10 (X) 减 1 (I)
 * 注意：49 不是 50 (L) 减 1 (I) 因为转换是基于小数位
 * <p>
 * 示例 2：
 * 输入：num = 58
 * 输出："LVIII"
 * 解释：
 * 50 = L
 * 8 = VIII
 * <p>
 * 示例 3：
 * 输入：num = 1994
 * 输出："MCMXCIV"
 * 解释：
 * 1000 = M
 * 900 = CM
 * 90 = XC
 * 4 = IV
 * <p>
 * 提示：1 <= num <= 3999
 *
 * @author huangchao E-mail:fengquan8866@163.com
 * @version 创建时间：2024/6/10 16:20
 */
public class 整数转罗马数字 {
    public static void main(String[] args) {
        System.out.println(intToRoman(1994));
        System.out.println(intToRoman(58));
        System.out.println(intToRoman(3749));
    }

    public static String intToRoman(int num) {
        int[] arr = new int[4];
        int nb = num;
        int i = 0;
        do {
            arr[i++] = nb % 10;
            nb = nb / 10;
        } while (nb > 0);
        int p = i == 4 ? 1000 : i == 3 ? 100 : i == 2 ? 10 : 1;
        StringBuilder sb = new StringBuilder();
        for (int j = i - 1; j >= 0; j--) {
            if (j == 3) {
                for (int k = 0; k < arr[j]; k++) {
                    sb.append('M');
                }
            } else if (j == 2) {
                if (arr[j] == 4) {
                    sb.append("CD");
                } else if (arr[j] == 9) {
                    sb.append("CM");
                } else if (arr[j] >= 5) {
                    sb.append('D');
                    for (int k = 5; k < arr[j]; k++) {
                        sb.append('C');
                    }
                } else {
                    for (int k = 0; k < arr[j]; k++) {
                        sb.append('C');
                    }
                }
            } else if (j == 1) {
                if (arr[j] == 4) {
                    sb.append("XL");
                } else if (arr[j] == 9) {
                    sb.append("XC");
                } else if (arr[j] >= 5) {
                    sb.append('L');
                    for (int k = 5; k < arr[j]; k++) {
                        sb.append('X');
                    }
                } else {
                    for (int k = 0; k < arr[j]; k++) {
                        sb.append('X');
                    }
                }
            } else {
                if (arr[j] == 4) {
                    sb.append("IV");
                } else if (arr[j] == 9) {
                    sb.append("IX");
                } else if (arr[j] >= 5) {
                    sb.append('V');
                    for (int k = 5; k < arr[j]; k++) {
                        sb.append('I');
                    }
                } else {
                    for (int k = 0; k < arr[j]; k++) {
                        sb.append('I');
                    }
                }
            }
        }
        return sb.toString();
    }
}
